//
//  ZJDynamicLoader.h
//  TestDemo
//
//  Created by 张润东 on 2021/3/16.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

///主工程对应节点：
///+(void)load方法中，runtime时只加载一次,在main函数之前执行
/// (常用于runtime交换方法,常量，全局变量，重要文件配置等。注意：尽量不要初始化对象，因为可能它还没加载，会影响启动时间)
static char * LEVEL_ClassLoad = "LEVEL_ClassLoad";

///主工程对应节点：
///application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
/// (能延时操作的尽量不要放在这里！会影响启动时间)
static char * LEVEL_APPLaunch = "LEVEL_APPLaunch";

///主工程对应节点：
///功能界面已经呈现给用户几秒钟后,由主工程决定几秒。
/// (不着急使用或加载的功能，比如表情配置文件,不可能一上来就发送图片，放在这里可以优化启动速度)
static char * LEVEL_ShowedSec= "LEVEL_ShowedSec";

///主工程对应节点：
///同意隐私协议之后
///一些有收集数据行为的第三方，初始化和自启动可以放在这里
static char * LEVEL_Privacy = "LEVEL_Privacy";

///主工程对应节点：
///工程内存警告⚠️
///组件，插件。该释放内存就释放吧
static char * LEVEL_MemWarning = "LEVEL_MemWarning";

///主工程对应节点：
///APP进入后台了
///进入后台，你们想要做点啥呢
static char * LEVEL_EnterBack = "LEVEL_EnterBack";



typedef void (*ONLDynamicLoaderInjectFunction)(void);

#define CRDYML_SEGMENTNAME "__DATA"
#define CRDYML_ATTRIBUTE(sectionName) __attribute((used, section(CRDYML_SEGMENTNAME "," #sectionName )))

#define CRDYML_FUNCTIONS_EXPORT_BEGIN(KEY) \
static void CRDYML_INJECT_##KEY##_FUNCTION(void){

#define CRDYML_FUNCTIONS_EXPORT_END(KEY) \
} \
static ONLDynamicLoaderInjectFunction dymlLoader##KEY##function CRDYML_ATTRIBUTE(KEY) = CRDYML_INJECT_##KEY##_FUNCTION;


@interface CHDynamicLoader : NSObject

+ (void)executeFunctionsForKey:(char *)key;

@end

NS_ASSUME_NONNULL_END
